#ifndef _CENTER_FRIEND_MAMANAGER_H_
#define _CENTER_FRIEND_MAMANAGER_H_

#include "Resource.h"
#include "ResourceManager.h"
#include "Singleton.h"
#include "String.h"
#include "Database/Field.h"
#include "DataManager.h"



#define DB_NAME_GAMEFRIEDN			"game_friends"
#define DB_NAME_FRIENDCATEGORY		"friend_category"
#define DB_NAME_USERRECORD			"user_record"
#define DB_NAME_CHATGROUPINFO		"chat_group_info"
#define DB_NAME_CHATGROUPPLAYER		"chat_group_player"

class  Database;
class  CharPtr;
class  ItemPtr;
class  WorldPacket;

typedef struct center_friends_tag_
{
	uint32 friend_id;		// 游戏好友ID
	uint32 group_id;		
	uint32 type;			// 好友类型
	uint8  flag;			// 好友标志
	uint8  status;			// 好友状态
	uint32 category;		// 好友分组
	
	uint32 create_gz_id;	// 创建好友关系时的分区ID
	uint32 src_platform_id;
	uint32 user_pid;
	uint32 friend_user_pid;
	String user_openid;
	String friend_user_openid;
	String name;
	String nick;
	String desc;
	String user_data;
	
	uint32 create_time;
	uint32 ll_time;
	
	uint32 data1;
	uint32 data2;
	uint32 data3;
	uint32 data4;
	int32  data5;
	int32  data6;
	int32  data7;
	int32  data8;
	float fdata1;
	float fdata2;
	float fdata3;
	float fdata4;
	String sdata1;
	String sdata2;
	String sdata3;
	String sdata4;
	
	center_friends_tag_()
	{
		Init();
	}
	
	void Init()
	{
		friend_id = 0;		// 游戏好友ID
		group_id = 0;		
		type = 0;			// 好友类型
		flag = 0;			// 好友标志
		status = 0;			// 好友状态
		category = 0;		// 好友分组
		
		create_gz_id = 0;
		src_platform_id = 0;
		user_pid = 0;
		friend_user_pid = 0;
		user_openid = "";
		friend_user_openid = "";
		name = "";
		nick = "";
		desc = "";
		user_data = "";
		
		create_time = 0;
		ll_time = 0;
		
		data1 = 0;
		data2 = 0;
		data3 = 0;
		data4 = 0;
		data5 = 0;
		data6 = 0;
		data7 = 0;
		data8 = 0;
		fdata1 = 0.0f;
		fdata2 = 0.0f;
		fdata3 = 0.0f;
		fdata4 = 0.0f;
		sdata1 = "";
		sdata2 = "";
		sdata3 = "";
		sdata4 = "";
	}

}CenterGameFriend;

enum enFriendInfoType
{
	enFriendLookType_None = 0,			// 无效
	enFriendLookType_LookOrUpdate = 1,	// 查看或更新
	enFriendLookType_Add = 2,			// 添加
	enFriendLookType_Delete = 3,		// 删除
};

enum enOperatorFriend
{
	enOperatorFriend_None = 0,		// 无效
	enOperatorFriend_Add = 1,		// 申请添加
	enOperatorFriend_Apply = 2,		// 同意添加
	enOperatorFriend_Refuse = 3,	// 拒绝添加
	enOperatorFriend_Delete = 4,	// 删除
	enOperatorFriend_Black = 5,		// 拉黑
};

enum enFriendStatus
{
	enFriendStatus_None = 0,		// 无效
	enFriendStatus_Require = 1,		// 申请好友
	enFriendStatus_WaitAdd = 2,		// 等待添加
	enFriendStatus_BeingFriend = 3,	// 成为好友
	enFriendStatus_Black = 4,		// 拉黑
	enFriendStatus_Delete = 255,	// 删除好友
};

// 好友游戏状态
enum enFriendGameStatus
{
	enFriendGameStatus_Init = 0,	// 默认状态
	enFriendGameStatus_Offline = 1,	// 离线状态
	enFriendGameStatus_Free = 2,	// 空闲状态
	enFriendGameStatus_Game = 3,	// 游戏状态
};

enum enCenterFriendProtocolResult
{
	enCFPR_Failed = 0,		// 失败
	enCFPR_Sucess = 1,		// 成功
	
	// 好友操作相关
	enCPFR_OP_NoFriendInfo = 2,		// 好友信息不存在
	enCPFR_OP_ErrorStatus = 3,		// 错误的操作状态
	enCPFR_OP_FriendOffline = 4,	// 目标玩家不在线
	enCPFR_OP_AlreadyFriends = 5,	// 已经是好友了
	enCPFR_OP_RequireListFull = 6,	// 目标玩家申请列表已满
	enCPFR_OP_CannotOpSelf = 7,		// 不能添加自己
	
	// 删除好友分组
	enOpFriendCate_NoThisCate = 2,	// 未找到此分组
	enOpFriendCate_NotYours = 3,	// 该分组不是你的
	enOpFriendCate_AlreadyCreated = 4,	// 已经创建过此分组
	enOpFriendCate_Limit = 5,		// 达到分组上限
};

enum enOperatorFriendCateType
{
	enOperatorFriendCateType_CreateNew = 1,	// 创建分组
	enOperatorFriendCateType_Delete = 2,	// 删除分组
};

enum enFriendListType
{
	enFriendListType_Require = 1,			// 申请列表
	enFriendListType_Friends = 2,			// 好友列表
};


//-----------------------公共好友数据--------------------------
class  SERVER_DECL CenterFriendsManager:public Singleton<CenterFriendsManager>
{
public:
	// 好友类型
	enum en_FriendType
	{
		en_FriendType_None = 0,
		en_FriendType_Platform = 1,		// 平台好友
		en_FriendType_Game 	= 2,		// 游戏好友
		en_FriendType_System 	= 100,	// 系统信息
	};
	
public:
	//==========================资源对象操作相关=================================
	/**
	 * @创建时间 2016-07-13
	 * @创建人 Roach
	 * @函数作用 添加一条CenterGameFriend记录
	 * @参数
	 * 	@pd	CenterGameFriend对象
	 */
	bool AddCenterGameFriend(CenterGameFriend & cGF);
	
	/**
	 * @创建时间 2016-07-13
	 * @创建人 Roach
	 * @函数作用 
	 * @参数
	 * 	@cGF CenterGameFriend对象
	 */
	bool UpdateCenterGameFriend(const CenterGameFriend & cGF);
	
	/**
	 * @创建时间 2016-07-13
	 * @创建人 Roach
	 * @函数作用 根据Fields的值来更新多个字段
	 * @参数
	 * 	@cgf_id	PD_ID
	 *	@fields	字段键值对,格式：fields["key1"] = 1; fields["key2"] = 2;...
	 */
	bool UpdateCenterGameFriend(Fields * fields, const char * QueryString, ...);
	bool UpdateCenterGameFriend(const uint32 &cgf_id, Fields * fields);
	
	
	/**
	 * @创建时间 2016-07-13
	 * @创建人 Roach
	 * @函数作用 根据PD_ID获取一条PD数据
	 * @参数
	 *  @cgf_id CenterGameFriend id
	 * 	@cgf	CenterGameFriend对象
	 */
	bool GetCenterGameFriend(const uint32 &cgf_id, CenterGameFriend * cgf);
	
	/**
	 * @创建时间 2016-07-13
	 * @创建人 Roach
	 * @函数作用 根据查询SQL，获取PD列表
	 * @参数
	 * 	@lstFriend	CenterGameFriend对象列表
	 *  @query 查询语句条件
	 */
	uint32 GetCenterGameFriendList(std::list<CenterGameFriend> * lstFriend, const char * query,...);
	
	//==========================资源对象操作相关=================================
	
	
	//==========================好友逻辑操作相关=================================
	// 更新平台好友
	bool UpdatePlatformFriends(CharPtr & pChr, const uint32 & gz_id ,std::list<String> vLFrdOpenid);
	// 好友数据更新（找到加为好友的其他人，更新他们的好友数据） 
	bool UpdateFriendData(CharPtr & pChr,Fields * fields);
	// 好友列表信息
	void GetFriendListInfo(CharPtr & pChr, const uint32 & type);
	// 获得系统推荐列表
	void GetSystemFriends(CharPtr & pChr);
	// 查看好友信息
	void LookFriendInfo(CharPtr & pChr,const uint32 & friend_pid);
	void LookFriendInfo(CharPtr & pChr,String openid);
	// 添加好友
	bool RequireFriend(CharPtr & srcChar,const uint32 & dest_pid);
	// 同意或拒绝添加好友
	bool AnswerAddFriend(CharPtr & pChr,const uint32 & require_pid,const uint8 & opType);
	// 删除好友
	bool DeleteFriend(CharPtr & pChr,const uint32 & friend_pid);
	// 拉黑好友（可以先不实现）
	bool BlackFriend(CharPtr & pChr,const uint32 & friend_pid);
	
	/**
	 * @创建时间 		2017-12-20
	 * @创建人 			Roach
	 * @函数作用 		更新好友游戏状态
	 * @参数		
	 * 	@pChr			角色Ptr
	 *  @status 		要更新的状态
	 *  @bForceUpdate 	强制更新状态
	 */
	bool UpdateFriendGameStatus(CharPtr & pChr, const uint32 & status, bool bForceUpdate = true);
	//==========================好友逻辑操作相关=================================
	
};

#define   sCenterFriendsMgr     CenterFriendsManager::getSingleton()

typedef struct center_friend_category_tag_
{
	uint32 cate_id;			// 好友分组ID
	uint32 group_id;		// 服务器群组ID
	uint32 pid;				// 好友PID
	String openid;			// 好友openid
	String name;			// 好友名字
	String desc;			// 好友备注信息
	
	uint32 create_time;		// 分组创建时间
	uint32 flag;			// 标志
	uint32 status;			// 状态
	
	uint32 data1;
	uint32 data2;
	int32 data3;
	int32 data4;
	float fdata1;
	float fdata2;
	
	String sdata1;
	String sdata2;
	
	center_friend_category_tag_()
	{
		Init();
	}
	
	void Init()
	{
		cate_id = 0;
		group_id = 0;		
		pid = 0;
		openid = "";
		name = "";
		desc = "";	
	
		create_time = 0;
		flag = 0;
		status = 0;
	
		data1 = 0;
		data2 = 0;
		data3 = 0;
		data4 = 0;
		fdata1 = 0.0f;
		fdata2 = 0.0f;
		
		sdata1 = "";
		sdata2 = "";
	}
	
}CenterFriendCategory;

//-------------------------好友分组------------------------
class  SERVER_DECL FriendCategoryManager:public Singleton<FriendCategoryManager>
{
public:
	/**
	 * @创建时间 2016-07-13
	 * @创建人 Roach
	 * @函数作用 添加一条CenterGameFriend记录
	 * @参数
	 * 	@pd	CenterGameFriend对象
	 */
	bool AddCenterFriendCategory(CenterFriendCategory & cFC);
	
	/**
	 * @创建时间 2016-07-13
	 * @创建人 Roach
	 * @函数作用 
	 * @参数
	 * 	@cFC CenterGameFriend对象
	 */
	bool UpdateCenterFriendCategory(const CenterFriendCategory & cFC);
	
	/**
	 * @创建时间 2016-07-13
	 * @创建人 Roach
	 * @函数作用 根据Fields的值来更新多个字段
	 * @参数
	 * 	@cgf_id	PD_ID
	 *	@fields	字段键值对,格式：fields["key1"] = 1; fields["key2"] = 2;...
	 */
	bool UpdateCenterFriendCategory(Fields * fields, const char * QueryString, ...);
	bool UpdateCenterFriendCategory(const uint32 &cgf_id, Fields * fields);
	
	
	/**
	 * @创建时间 2016-07-13
	 * @创建人 Roach
	 * @函数作用 根据PD_ID获取一条PD数据
	 * @参数
	 *  @cgf_id CenterFriendCategory id
	 * 	@cFC	CenterGameFriend对象
	 */
	bool GetCenterFriendCategory(const uint32 &cgf_id, CenterFriendCategory * cFC);
	
	/**
	 * @创建时间 2016-07-13
	 * @创建人 Roach
	 * @函数作用 根据查询SQL，获取PD列表
	 * @参数
	 * 	@lstPubData	CenterGameFriend对象列表
	 *  @query 查询语句条件
	 */
	uint32 GetCenterFriendCategoryList(std::list<CenterFriendCategory> * lstData, const char * query,...);
	
	// 创建分组
	bool CreateFriendCategory(CharPtr & pChr, String name);
	// 删除分组
	bool DeleteFriendCategory(CharPtr & pChr, const uint32 & cate_id);
	
};

#define	 sFriendCateMgr		 FriendCategoryManager::getSingleton()

typedef struct center_friend_record_tag_
{
	uint32 record_id;		//记录ID
	uint32 group_id;		//服务器组ID
	uint8 status;			//状态
	uint32 pid;				//用户PID
	String openid;			//用户openid
	uint32 gz_id;			//数据分区ID
	uint32 lu_timer;		//数据最后一次更新时间
	String record_data;		//记录数据字符串
	
	uint32 data1;			
	uint32 data2;			
	uint32 data3;			
	uint32 data4;			
	uint32 data5;			
	uint32 data6;			
	uint32 data7;			
	uint32 data8;			
	float fdata1;
	float fdata2;
	String sdata1;
	String sdata2;
	
	center_friend_record_tag_()
	{
		Init();
	}
	
	void Init()
	{
		record_id = 0;
		group_id = 0;
		status = 0;
		pid = 0;
		openid = "";
		gz_id = 0;
		lu_timer = 0;
		record_data = "";
		data1 = 0;
		data2 = 0;
		data3 = 0;
		data4 = 0;
		data5 = 0;
		data6 = 0;
		data7 = 0;
		data8 = 0;
		fdata1 = 0.0f;
		fdata2 = 0.0f;
		sdata1 = "";
		sdata2 = "";
	}
	
}CenterFriendRecord;

struct stGzidSampleCountInfo
{
	uint32 gz_id;		// 分区
	uint32 mode;		// 玩法
	uint32 zcs;			// 总次数
	uint32 slcs;		// 胜利次数
	
	stGzidSampleCountInfo()
	{
		Init();
	}
	
	void Init()
	{
		gz_id = 0;
		mode = 0;
		zcs = 0;
		slcs = 0;
	}
};

enum enCommitInfo
{
	enCommitInfo_Create = 1,	//创建
	enCommitInfo_Update = 2,	//更新
};

//-------------------------好友统计信息-----------------------
class  SERVER_DECL FriendGameRecordsManager:public Singleton<FriendGameRecordsManager>
{
public:
	/**
	 * @创建时间 2016-07-13
	 * @创建人 Roach
	 * @函数作用 添加一条CenterGameFriend记录
	 * @参数
	 * 	@cFR	CenterFriendRecord
	 */
	bool AddCenterFriendRecord(CenterFriendRecord & cFR);
	
	/**
	 * @创建时间 2016-07-13
	 * @创建人 Roach
	 * @函数作用 更新friendrecord数据
	 * @参数
	 * 	@cFR CenterFriendRecord
	 */
	bool UpdateCenterFriendRecord(const CenterFriendRecord & cFR);
	
	/**
	 * @创建时间 2016-07-13
	 * @创建人 Roach
	 * @函数作用 更新friendrecord数据
	 * @参数
	 * 	@cfr_id	
	 *	@fields	字段键值对,格式：fields["key1"] = 1; fields["key2"] = 2;...
	 */
	bool UpdateCenterFriendRecord(Fields * fields, const char * QueryString, ...);
	bool UpdateCenterFriendRecord(const uint32 &cfr_id, Fields * fields);
	
	
	/**
	 * @创建时间 2016-07-13
	 * @创建人 Roach
	 * @函数作用 根据PD_ID获取一条PD数据
	 * @参数
	 *  @cfr_id CenterFriendRecord id
	 * 	@cFR	CenterGameFriend对象
	 */
	bool GetCenterFriendRecord(const uint32 &cfr_id, CenterFriendRecord * cFR);
	
	/**
	 * @创建时间 2016-07-13
	 * @创建人 Roach
	 * @函数作用 获取记录列表
	 * @参数
	 * 	@lstData	CenterFriendRecord对象列表
	 *  @query 查询语句条件
	 */
	uint32 GetCenterFriendRecordList(std::list<CenterFriendRecord> * lstData, const char * query,...);
	
	//========================逻辑操作相关===================================
	
	// 提交记录数据 pChr 角色  sInfo 统计信息 mode 游戏模式
	bool CommitPlayerInfoToCenter(CharPtr & pChr,  String & sInfo, const uint8 & mode = 1);
	
	// 提交一场最终结果数据
	bool CommitFinalCenterBattleData(CharPtr & pChr, const uint8 & mode, const uint32 & game_id, int32 & final_winlose);
	
	// 读取记录数据 加上几个参数传递进来2017-02-14
	bool GetPlayerCenterInfo(CharPtr & pChr, const uint32 & pid, const uint32 & gz_id, const uint8 & mode);
	// 读取统计信息 2018-03-14
	bool GetPlayerCenterInfo(CharPtr & pChr, const uint32 & pid, std::map<uint32, uint32> mapGzidMode);
	// 获取玩家统计数据
	bool GetPlayerRecordInfo(CharPtr & pChr, CenterFriendRecord & cfr, const uint8 & mode = 1);
	
	// 保存玩家游戏配置
	bool SavePlayerGameConfig(CharPtr & pChr, String & config);
	
	// 读取玩家游戏配置
	String GetPlayerGameConfig(CharPtr & pChr);
	
	//========================逻辑操作相关===================================
};

#define	 sFriendRecordMgr		 FriendGameRecordsManager::getSingleton()


/********************************************聊天组****************************************/

typedef struct chat_group_tag_
{
	uint64 chat_group_id;			// 群组ID
	uint32 agent_id;				// 代理商ID
	uint32 game_id;					// 游戏ID
	uint32 gz_id;					// 分区ID
	uint32 status;					// 群状态
	uint32 create_pid;				// 创建者玩家PID

	uint32 owner_pid;				// 群主PID
	String owner_name;				// 群主昵称

	String name;					// 群名称
	String notice;					// 公告信息

	uint32 max_num;					// 最大人数
	uint32 curr_num;				// 当前人数
	uint32 require_num;				// 申请数量

	String create_time;				// 群创建时间
	
	chat_group_tag_()
	{
		Init();
	}
	
	void Init()
	{
		chat_group_id = 0;
		agent_id = 0;
		game_id = 0;
		gz_id = 0;
		status = 0;
		create_pid = 0;
		
		owner_pid = 0;
		owner_name = "";
		name = "";
		notice = "";
		
		max_num = 0;
		curr_num = 0;
		require_num = 0;
		
		create_time = "";
	}
	
}ChatGroup;

enum enCreateChatGroupResult
{
	enCreateChatGroupResult_Failed = 0,			// 创建失败
	enCreateChatGroupResult_Sucess = 1,			// 创建成功
	enCreateChatGroupResult_EmptyName = 2,		// 群名称不能为空
	enCreateChatGroupResult_CreateMax = 3,		// 创建公会数量达到上限
	
};

enum enOpChatGroupType
{
	enOpChatGroupType_ChangeName = 1,			// 修改群名称
	enOpChatGroupType_ChangeNotice = 2,			// 修改群公告
};

enum enChatGroupMemberType
{
	enChatGroupMemberType_Normal = 0,			// 普通成员
	enChatGroupMemberType_Manager = 1,			// 管理员
	enChatGroupMemberType_Owner = 2,			// 群主
};

//-------------------------聊天组信息-----------------------
class  SERVER_DECL ChatGroupManager:public Singleton<ChatGroupManager>
{
public:
	// 添加群组信息
	bool AddChatGroup(ChatGroup & cg);
	
	// 更新群组信息
	bool UpdateChatGroup(const ChatGroup & cg);
	bool UpdateChatGroup(Fields * fields, const char * QueryString, ...);
	bool UpdateChatGroup(const uint64 &cg_id, Fields * fields);
	
	// 获得群组信息
	bool GetChatGroup(const uint64 &cg_id, ChatGroup * cg);
	// 获得群组列表信息
	uint32 GetChatGroupList(std::list<ChatGroup> * lstData, const char * query,...);
	
public:
	//============================逻辑部分================================
	// 创建群
	uint8 CreateChatGroup(CharPtr & pChr, String name);
	// 解散群
	uint8 DeleteChatGroup(CharPtr & pChr, const uint64 & chat_group_id);
	// 修改群消息（名称，公告）
	uint8 ChangeChatGroupInfo(CharPtr & pChr, const uint64 & chat_group_id, const uint32 & type, String & strData);
	
	
	//============================逻辑部分================================
};

#define	 sChatGroupMgr		 ChatGroupManager::getSingleton()


typedef struct chat_group_player_
{
	uint64 group_player_id;		// 群组玩家ID
	uint64 chat_group_id;		// 群组ID
	uint32 status;				// 状态（0 申请 1 成员 255 删除）
	uint32 type;				// 类型（0 普通成员 1 管理员 2 群主）
	uint32 pid;					// 玩家PID
	
	String nick;				// 玩家昵称
	String head_url;			// 头像地址
	String create_time;			// 创建时间
	
	chat_group_player_()
	{
		Init();
	}
	
	void Init()
	{
		group_player_id = 0;
		chat_group_id = 0;
		status = 0;
		type = 0;
		pid = 0;
		
		nick = "";
		head_url = "";
		create_time = "";
	}
	
}ChatGroupPlayer;

//-------------------------聊天组成员信息-----------------------
class  SERVER_DECL ChatGroupPlayerManager:public Singleton<ChatGroupPlayerManager>
{
public:
	// 添加群组信息
	bool AddChatGroupPlayer(ChatGroupPlayer & cg);
	
	// 更新群组信息
	bool UpdateChatGroupPlayer(const ChatGroupPlayer & cg);
	bool UpdateChatGroupPlayer(Fields * fields, const char * QueryString, ...);
	bool UpdateChatGroupPlayer(const uint32 &cg_id, Fields * fields);
	
	// 获得群组信息
	bool GetChatGroupPlayer(const uint32 &cg_id, ChatGroupPlayer * cg);
	// 获得群组列表信息
	uint32 GetChatGroupPlayerList(std::list<ChatGroupPlayer> * lstData, const char * query,...);
	
public:
	//============================逻辑部分================================
	
	
	
	//============================逻辑部分================================
	
	
	
};

#define	 sChatGroupPlayerMgr		 ChatGroupPlayerManager::getSingleton()

#endif
